home *** CD-ROM | disk | FTP | other *** search
/ PsL Monthly 1993 December / PSL Monthly Shareware CD-ROM (December 1993).iso / prgmming / dos / c / pcpilot.exe / lha / BASECVT.C < prev    next >
Text File  |  1990-01-13  |  3KB  |  116 lines

  1. /*
  2.     BASECVT.C - Convert between Decimal/Hexadecimal/Binary number bases.
  3.                 The idea for this method was originally thought of by
  4.                 Andrew Walsh and his Tonto! v1.01 TSR program.
  5. */
  6.  
  7. #include <stdio.h>
  8. #include <ctype.h>
  9. #include <kbd.h>
  10.  
  11. extern unsigned long NumIdx;
  12.  
  13. extern int BorderClr;
  14. extern int TitleClr;
  15. extern int TextClr;
  16. extern int FooterClr;
  17.  
  18. void BaseConvert(void);
  19. static void DrawMenu(void);
  20. static char *BinStr(char *str);
  21.  
  22. void BaseConvert()
  23. {
  24.     char binnum[80];
  25.  
  26.     ScrPush();
  27.     DrawMenu();
  28.  
  29.     for (;;)    {
  30.         ultoa(NumIdx, binnum,  2); strcpy(binnum, BinStr(binnum));
  31.         PutStr(51,7, TextClr, "%22lu ", NumIdx);
  32.         PutStr(55,9, TextClr, "%18X ",  NumIdx);
  33.         PutStr(50,11,TextClr, "%23s ",  binnum);
  34.         switch (KbdGetC())    {
  35.             case UP:
  36.                 if (++NumIdx > 65535) NumIdx = 0;
  37.                 break;
  38.             case DN:
  39.                 if (--NumIdx < 0 || NumIdx > 65535) NumIdx = 65535;
  40.                 break;
  41.             case PGUP:
  42.                 NumIdx += 10;
  43.                 if (NumIdx > 65535) NumIdx = 0;
  44.                 break;
  45.             case PGDN:
  46.                 NumIdx -= 10;
  47.                 if (NumIdx < 0 || NumIdx > 65535) NumIdx = 65535;
  48.                 break;
  49.             case 0x8400:            /* Ctrl-PgUp */
  50.                 NumIdx += 100;
  51.                 if (NumIdx > 65535) NumIdx = 0;
  52.                 break;
  53.             case 0x7600:            /* Ctrl-PgDn */
  54.                 NumIdx -= 100;
  55.                 if (NumIdx < 0 || NumIdx > 65535) NumIdx = 65535;
  56.                 break;
  57.             case HOME:
  58.                 NumIdx = 0;
  59.                 break;
  60.             case END:
  61.                 NumIdx = 65535;
  62.                 break;
  63.             case RET:
  64.             case ESC:
  65.                 ScrPop(1);
  66.                 return;
  67.         }
  68.     }
  69. }
  70.  
  71. static char *BinStr(char *str)
  72. {
  73.     register int i=0, j=0, k=0;
  74.     char temp[80];
  75.  
  76.     temp[0] = '\0';
  77.     strrev(str);
  78.     while (*str)    {
  79.         if (i == 4)    {
  80.             temp[j+1] = '\0';
  81.             temp[j++] = ' ';
  82.             i = 0;
  83.         }
  84.         i++;
  85.         temp[j+1] = '\0';
  86.         temp[j++] = *str++;
  87.     }
  88.     for (k=j; k<19; k++)    {
  89.         if (i == 4)    {
  90.             temp[k+1] = '\0';
  91.             temp[k++] = ' ';
  92.             i = 0;
  93.         }
  94.         i++;
  95.         temp[k+1] = '\0';
  96.         temp[k] = '0';
  97.     }
  98.  
  99.     strrev(temp);
  100.     return(temp);
  101. }
  102.  
  103. static void DrawMenu()
  104. {
  105.     ShadowBox(41,4,74,14, 2, BorderClr);
  106.     PutStr(42,5, TitleClr,   "       Number Conversions       ");
  107.     PutStr(41,6, BorderClr, "╞════════════════════════════════╡");
  108.     PutStr(42,7, FooterClr,  " Decimal:");
  109.     PutStr(41,8, BorderClr, "╞════════════════════════════════╡");
  110.     PutStr(42,9, FooterClr,  " Hexadecimal:");
  111.     PutStr(41,10,BorderClr, "╞════════════════════════════════╡");
  112.     PutStr(42,11,FooterClr,  " Binary:");
  113.     PutStr(41,12,BorderClr, "╞════════════════════════════════╡");
  114.     PutStr(42,13,FooterClr, " %c %c PgUp PgDn ^PgUp ^PgDn Esc ", 24, 25);
  115. }
  116.